package com.cskaoyan.javase.oop1._1basic;

/**
 * 需求：创建学生对象
 * 要想创建学生对象，首先需要定义对象的"模板"——学生类
 * 类的定义
 * 定义类包括定义类本身，和定义类中结构两部分。
 * 1.定义类结构本身
 * 语法：
 * [类修饰符列表] class 类名{
 *   // 类体
 * }
 * 类修饰符列表：能够修饰类class的修饰符很少,这里我们暂时没有学
 * 目前定义类的两种:
 *      1.public class
 *      2.非public class
 * 这些类在同一个Java文件中定义,都属于同包关系.
 * 约定:
 * 在实际开发中，绝大多数情况下，一个Java文件里往往都只有一个和文件名相同的public class。
 * 但为了上课方便，避免切换Java文件导致的麻烦，我们约定：
 * 以一个public class作为测试类，然后在下面定义非public class用于测试！
 *
 * 注意事项:
 *      类是可以嵌套定义的
 *      这种嵌套定义在某个类类体中的类称之为"内部类"
 *      内部类的语法我们没有学习,请大家暂时不要定义内部类
 *
 * 2.类中结构的定义,类是如何作为创建对象的模板来描述全体对象共性的呢?
 * 既然类是创建对象的"模板"，那么就应该能够描述一种类别的全体对象，所以：
 *      1.我们抽象对象全体的共有"属性"，在类中用"成员变量"来描述对象共性的属性。
 *          局部变量: 定义在局部位置的变量就是一个局部变量
 *          局部位置: 类体中,包括方法体的大括号,类体中大括号以及这些大括号中的大括号
 *              统称为"代码块" 代码块当中就是局部位置
 *          成员变量: 定义在成员位置的变量就是一个成员变量
 *          成员位置: 类体中,局部位置以外的位置(就是类体中直接定义),就是成员位置
 *          成员变量的定义语法:
 *              [修饰符列表] 数据类型 成员变量名;
 *              可以修饰成员变量的修饰符有很多
 *              但是今天我们先默认它空着 不写
 *
 *      2.我们抽象对象全体的共有"行为"，在类中用"成员方法"来描述对象共性的行为。
 *          成员方法: 定义在成员位置的,并且修饰符列表没有static的方法,称之为"成员方法"
 *          语法:
 *          [访问权限修饰符] 返回值类型 方法名(形参列表){
 *                  // 方法体
 *          }
 *          访问权限修饰符我们没有学,默认是public.
 *
 * 细节:
 *      1.我们将成员变量和成员方法合起来统称为类的（普通）成员。
 *      2.定义类时,普遍是先定义成员变量,成员方法放在后面(待补充)
 *
 * 以上,完成一个类的定义.
 *
 * 下面开始创建对象,根据类这样一个模板
 * 在哪里创建?
 * 可以创建对象的位置很多,但是一般都会在方法中创建,这里我们就在Demo类(其他类)中的main方法中创建Student类的对象
 *
 * 在访问权限允许的情况下,在方法当中创建对象的语法是:
 * 类名 对象名 = new 类名();
 * 这里:
 * 对象名仍然是一个局部变量,是一个存储在方法栈帧中的引用
 * new关键字表示在堆上创建对象
 * 引用通过存储堆上对象的地址和对象产生关系
 *
 * 对象的使用
 * 成员变量/方法,它们可以直接访问/调用吗?
 * 不能
 * 需要先创建对象,然后才能访问/调用它们
 * 语法(如果有访问权限的话):
 * 成员变量的访问/赋值:
 *      对象名.成员变量名
 *      成员变量和数组中的元素一样,都具有默认初始化的过程,具有默认值
 *      本质上都是对象中的元素具有默认值
 *
 * 成员方法的调用
 *      对象名.成员方法名(实参)
 *
 * @since 14:53
 * @author wuguidong@cskaoyan.onaliyun.com
 */
// Demo类作为一个测试类
public class Demo {
    public static void main(String[] args) {
        // 创建Student类的对象
        Student stu = new Student();
        stu.age = 18;
        System.out.println(stu.age);
        System.out.println(stu.name);

        stu.eat();
        stu.sleep();
    }

    public static void test() {
    }
    // 定义类的时候可以嵌套吗? 可以
    // class Student{}
}

// 学生类
class Student {
    // 在类体中的成员位置,使用成员变量描述全体学生对象在属性上的共性
    String name;
    int age;
    double score;

    // 在类体中的成员位置,使用成员方法描述全体学生对象在行为上的共性
    public void study() {
        System.out.println("好好学习,天天向上⬆");
    }

    public void sleep() {
        System.out.println("好好睡觉,才能好好学习!");
    }

    public void eat() {
        System.out.println("5分钟吃完饭!");
    }
}

class A {
}
